package com.FileManager;

import com.ui.ProcessSchedulerUI;
import javafx.application.Platform;

import java.util.List;
import java.util.ArrayList;

public class File_Manager {
    public boolean isInitialized = false;
    //FCFS先来先服务，在当前位置出发，从一个序列中依次读入数字，计算数字与当前位置的距离，更新当前位置为读入的数字。返回总数
    public int FCFS(int read_list[],int position) {
        int total_time=0;
        //创建了一个名为move_list的列表（List）对象，该列表中的元素类型为整数（Integer）。
        List<Integer> move_list= new ArrayList<>();
        // 循环read_list列表每一个位置，
        for (int i=0;i<read_list.length;i++)
        {
//        total_time += 从position移动到第i + 1个位置的举例
            total_time+=Math.abs(position-read_list[i]);
            position=read_list[i];
            System.out.println(position);
            move_list.add(read_list[i]);
        }
        return total_time;
    }

    //SSTF找最近的
    public int SSTF(int read_list[],int position) {
        int total_time=0;
        List<Integer> move_list= new ArrayList<>();
        // 找最近的的
        for (int i=0;i<read_list.length;i++)
        {
            int[] rear_position=find_rear_position(read_list,position);
            total_time+=Math.abs(position-read_list[rear_position[0]]);
            position=read_list[rear_position[0]];
            // 检查JavaFX是否已经初始化
            if (isInitialized) ProcessSchedulerUI.updatemanagement(position+"");
            System.out.println(position);
            move_list.add(read_list[rear_position[0]]);
            read_list[rear_position[0]]=10000000;
        }
        return total_time;
    }

    //find_rear_position函数的实现
    public int[] find_rear_position(int read_list[],int position)
    {
        int result[]=new int[2];//0表示数组里的下标，1表示数组里的最近的值
        result[0]=-1;
        result[1]=100000000;
        for (int i=0;i<read_list.length;i++)
        {
            int distance=Math.abs(position-read_list[i]);
            if (distance<result[1])
            {
                result[0]=i;
                result[1]=distance;
            }
        }
        return result;
    }

    //判断方向
    public int get_direct(int number)
    {
        if (number>0) return 1;else return -1;
    }

    //SCAN 根据position拆分成左右两部分（左侧序列比position小，右侧序列比position大）
    public int[] find_rear_position_SCAN(int read_list[],int position,int direct)
    {
        int result[]=new int[2];//0表示数组里的下标，1表示数组里的最近的值
        result[0]=-1;
        result[1]=100000000;
        for (int i=0;i<read_list.length;i++)
        {
            //加上方向的最小值      当前位置 100       80 90  130 150 方向是+1
            int distance1 = read_list[i]-position ;
            if (get_direct(distance1)==direct)
            {
                int distance=Math.abs(distance1);
                if (distance < result[1]) {
                    result[0] = i;
                    result[1] = distance;
                }
            }
        }
        if (result[1]==100000000||read_list[result[0]]==10000000){
            result=find_rear_position_SCAN(read_list,position,-1*direct);
        }
        return result;
    }

    //SCAN
    public int SCAN(int read_list[],int position,int direct) {
        int total_time=0;
        List<Integer> move_list= new ArrayList<>();
        // 找最近的的
        for (int i=0;i<read_list.length;i++)
        {
            int[] rear_position=find_rear_position_SCAN(read_list,position,direct);
            total_time+=Math.abs(position-read_list[rear_position[0]]);
            position=read_list[rear_position[0]];
            System.out.println(position);
            move_list.add(read_list[rear_position[0]]);
            read_list[rear_position[0]]=10000000;
        }
        return total_time;
    }
}
